package cn.lingyangwl.agile.pay.client.service;

import cn.lingyangwl.agile.pay.model.rqrs.pay.payorder.PayOrderNotify;
import cn.lingyangwl.agile.pay.model.rqrs.pay.refund.RefundOrderNotify;
import cn.lingyangwl.agile.pay.client.model.rqrs.ConfirmOrderRQ;
import cn.lingyangwl.agile.pay.client.model.rqrs.ConfirmOrderRS;
import cn.lingyangwl.agile.pay.client.model.rqrs.GoodsRefundRQ;
import cn.lingyangwl.agile.pay.client.model.entity.GoodsOrder;
import cn.lingyangwl.agile.pay.client.model.mq.GoodsOrderCloseMQ;
import cn.lingyangwl.agile.pay.client.model.mq.GoodsOrderRefundMQ;
import com.baomidou.mybatisplus.extension.service.IService;

/**
 * @author shenguangyang
 */
public interface GoodsOrderService extends IService<GoodsOrder> {
    /**
     * setup
     * 1. 生成订单
     * 2. 调用第三方下单接口
     */
    ConfirmOrderRS confirmOrder(ConfirmOrderRQ req);

    /**
     * 继续支付, 用户很有可能点击付款后, 然后退出去了, 并没有付款, 此时订单处于未支付状态, 用户可以在 <br/>
     * 待支付页面, 继续支付未完成的订单
     *
     * @param mchOrderNo 商户订单号
     * @return 支付信息
     */
    ConfirmOrderRS continuePay(String mchOrderNo);

    /**
     * 延迟消息的时间需要比订单过期时间长一点，这样就不存在查询的时候，用户还能支付成功
     * <p>
     * 查询订单是否存在，如果已经支付则正常结束
     * 如果订单未支付，主动调用第三方支付平台查询订单状态
     * 1. 确认未支付，本地取消订单
     * 2. 如果第三方平台已经支付，主动的把订单状态改成已支付，造成该原因的情况可能是支付通道回调有问题，然后
     * 触发支付后的动作，如何触发？RPC还是？
     */
    boolean closeGoodsOrder(GoodsOrderCloseMQ.MsgPayload msgPayload);

    /**
     * 支付成功后支付平台的回调
     */
    void payNotify(PayOrderNotify req);

    /**
     * 退款成功后支付平台的回调
     */
    void refundNotify(RefundOrderNotify req);

    /**
     * 取消订单
     *
     * @param mchOrderNo 订单号
     */
    void closeGoodsOrder(String mchOrderNo);

    /**
     * 退款
     *
     * @param req 请求
     */
    void refund(GoodsRefundRQ req);

    /**
     * 定时处理订单退款
     */
    boolean refund(GoodsOrderRefundMQ.MsgPayload msgPayload);
}
